今天依然是 Multi AI Agents 主題,只不過今天的 Multi AI Agents 概念上不同於上一篇的協同合作,而是這些 Multi AI Agents 有自已擅長的能力,而系統會根據使用者的目標任務,將不同類型的工作交由最合適的 AI Agent 來處理。
想像一下,在一個真實的辦公室情境,A 負責撰寫廣告文案,B 是辦公室小秘書負責你的行程安排,因此當你接到有文案要做的時候,會請 A 同事來負責撰寫文案,而當你想知道你明天有什麼行程安排時,你會問小秘書。我們就來看看這樣的場景如何使用 AI Agent 的概念來實現。
你是一位有20年經驗的文案撰寫者,以簡潔和冷幽默著稱。
你的目標是作為專家提供最佳文案。每次只提供一個提案。
你應該專注於這個任務,不要分心或做其他事情。
始終以繁體中文回應。
private ChatCompletionAgent CopyWriterAgent()
{
string agentName = "CopyWriterAgent";
string agentInstructions =
"""
You are a copywriter with 20 years of experience, known for brevity and dry humor.
Your goal is to provide the best copy as an expert.
Only offer one proposal at a time.
You should focus on this task and not get distracted or do anything else.
Always respond in Traditional Chinese.
""";
ChatCompletionAgent agent = new()
{
Name = agentName,
Instructions = agentInstructions,
Kernel = _kernel
};
return agent;
}
你是一位辦公室秘書,負責管理我的行程。
當我詢問行程時,只需清楚提供行程細節。
不要浪費時間閒聊。始終以繁體中文回應。
private ChatCompletionAgent OfficeSecretaryAgent()
{
string agentName = "OfficeSecretaryAgent";
var agentInstructions =
"""
You are an office secretary, and your job is to manage my schedule.
When I ask you about my schedule, just clearly provide the details of my schedule
Don't waste time on small talk.
Always respond in Traditional Chinese.
""";
ChatCompletionAgent agent =
new()
{
Name = agentName,
Instructions = agentInstructions,
Kernel = _kernel,
Arguments = new KernelArguments(new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions })
};
agent.Kernel.Plugins.Add(KernelPluginFactory.CreateFromType<OfficePlugin>()); //Plugin Function:GetSchedule
agent.Kernel.Plugins.Add(KernelPluginFactory.CreateFromType<DateTimePlugin>());
return agent;
}
另外這個小秘書 Agent,由於需要管理行程,因此需要有 Plugin Function 才能配合外部系統取得行程資訊。這裡撰寫了一個 Function 用來模擬提供行程資訊,然實際上程式邏輯可以使用 API 串接外部系統來實現這個情境。
[KernelFunction, Description("Get schedule by date")]
public string GetSchedule([Description("schedule on the date")] string date)
{
// Generate mock schedule data
var random = new Random();
var events = new List<string> { "Meeting with customer", "Team Standup", "Project Presentation", "Lunch with Client", "Code Review" };
var times = new List<string> { "10:00 AM", "11:00 AM", "1:00 PM", "2:00 PM", "3:00 PM" };
var locations = new List<string> { "Conference Room", "Office", "Cafeteria", "Client's Office", "Online" };
var eventIndex = random.Next(events.Count);
var timeIndex = random.Next(times.Count);
var locationIndex = random.Next(locations.Count);
var schedules = new List<Dictionary<string, string>>();
for (int i = 0; i < 5; i++)
{
eventIndex = random.Next(events.Count);
timeIndex = random.Next(times.Count);
locationIndex = random.Next(locations.Count);
schedules.Add(new Dictionary<string, string>
{
{ "Date", date },
{ "Event", events[eventIndex] },
{ "Time", times[timeIndex] },
{ "Location", locations[locationIndex] }
});
}
return System.Text.Json.JsonSerializer.Serialize(schedules);
}
KernelFunction terminationFunction =
AgentGroupChat.CreatePromptFunctionForStrategy(
$$$"""
if the user request has been answered, respond with a single word: yes, otherwise return no.
History:
{{${{{KernelFunctionTerminationStrategy.DefaultHistoryVariableName}}}}}
""",
safeParameterNames: "history");
Prompt 的內容大意是 :
"根據我的目標需求確定下一位發言的參與者。 僅提供下一位發言者的名稱。不能讓同一位參與者連續發言。
只能從以下參與者中選擇:
{{{copyWriterAgent.Name}}}
{{{officeSecretaryAgent.Name}}}
選擇下一位參與者時,始終遵循以下規則:
如果使用者請求與文案撰寫有關的任務,則輪到{{{copyWriterAgent.Name}}}。
如果使用者請求與行程安排有關的任務,則輪到{{{officeSecretaryAgent.Name}}}。
回應下一位發言者的名稱。"
其中 copyWriterAgent.Name 與 officeSecretaryAgent.Name 分別表示的是 2 個 Agent 的名稱。
KernelFunction selectionFunction =
AgentGroupChat.CreatePromptFunctionForStrategy(
$$$"""
Determine the next participant to speak based on my goal requirements.
Only provide the name of the next participant to speak. No participant should speak consecutively.
Choose only from these participants:
- {{{copyWriterAgent.Name}}}
- {{{officeSecretaryAgent.Name}}}
Always follow these rules when selecting the next participant:
- If user request about copywriting task, it is {{{copyWriterAgent.Name}}}'s turn.
- If user request about scheduling task, it is {{{officeSecretaryAgent.Name}}}'s turn.
Respond with the name of the next participant to speak.
History:
{{$history}}
""",
safeParameterNames: "history");
AgentGroupChat chat = new(officeSecretaryAgent, copyWriterAgent)
{
ExecutionSettings = new()
{
TerminationStrategy = new KernelFunctionTerminationStrategy(terminationFunction, _kernel)
{
ResultParser = (result) => result.GetValue<string>()?.Contains("yes", StringComparison.OrdinalIgnoreCase) ?? false,
MaximumIterations = 5,
AutomaticReset = true
},
SelectionStrategy =
new KernelFunctionSelectionStrategy(selectionFunction, _kernel)
{
// 從結果中取得下一個對話參與者, 如果沒有結果就回到 officeSecretaryAgent
ResultParser = (result) => result.GetValue<string>() ?? officeSecretaryAgent.Name,
// prompt 中的 history 變數名稱
HistoryVariableName = "history",
// 決定要保留對話紀錄的回合數,可以用於節省 token的使用
HistoryReducer = new ChatHistoryTruncationReducer(1),
}
}
};
// 模擬連續對話過程
await InvokeAgentAsync("交一份手機的文案給我");
await InvokeAgentAsync("我明天的行程是什麼");
async Task InvokeAgentAsync(string input)
{
//使用者prompt加入對話記錄
ChatMessageContent message = new(AuthorRole.User, input);
chat.AddChatMessage(message);
await foreach (ChatMessageContent response in chat.InvokeAsync())
{
Console.WriteLine($"{response.AuthorName}: {response.Content}");
}
Console.WriteLine($"\n[IS COMPLETED: {chat.IsComplete}]");
}
CopyWriterAgent: 新的 X-Phone,不僅能打電話,還能拍照、上網、發呆。輕鬆應對生活中的每一個“嘿,幫我看一下!”
[IS COMPLETED: True]
OfficeSecretaryAgent: 您明天的行程如下:
1. **項目報告**
時間:11:00 AM
地點:辦公室
2. **團隊站會**
時間:2:00 PM
地點:辦公室
3. **與客戶午餐**
時間:3:00 PM
地點:客戶辦公室
4. **項目報告**
時間:3:00 PM
地點:會議室
5. **團隊站會**
時間:11:00 AM
地點:線上
[IS COMPLETED: True]
這個 Multi AI Agent 適用於多種工作場景,它模擬了人類專業分工的運作模式,透過任務目標,將不同類型的工作交由最合適的 AI Agent 來處理,能夠將單一AI Agent 設計的更專業,能力更專精,進行提供更好的生成品質。
在本文的示範場景裡,你可以想像若完整且具體實踐後會是....
copyWriter Agent 會是一位高度專業的文案創作者,擅長撰寫各種類型的文案,包括廣告、行銷內容、社交媒體貼文。不論是行銷性文字還是資訊傳遞型的內容,它都能迅速理解需求並生成符合目標讀者喜好的文本品質。當使用者提出需要撰寫或修改文案的要求時,copyWriter Agent 便會被委派這項任務,並在短時間內提供一份專業、具創意的文案。
officeSecretary Agent 則專注於秘書型任務,特別是行程管理、任務安排與時間規劃。officeSecretary Agent 擁有極高的組織能力,能夠有效管理每日行程、預約會議、提醒重要的工作事項,並確保所有活動不會衝突。當使用者需要安排會議、設置提醒或檢查時間表時,officeSecretary Agent 會立即處理並提供最佳的行程規劃建議。
接連二篇的 Multi AI Agent 示範,卻是不同的設計,這也表示 Multi AI Agent 的設計實際上有很多的可能性,就像真實人類一樣,都許許多多不同處理事情的方式,做為智能代理當然也能實現許多的可能性。